Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

library(flexdashboard)
library(ggplot2)
library(plotly)

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
library(tidyverse)
── Attaching core tidyverse packages ────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ lubridate 1.9.3     ✔ tibble    3.2.1
✔ purrr     1.0.2     ✔ tidyr     1.3.0── Conflicts ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks plotly::filter(), stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(RMySQL)
library(DBI)
library(tidytext)
library(wordcloud)
Loading required package: RColorBrewer
# Connect to a SQLite in-memory database
database <- dbConnect(MySQL(), 
                      dbname = "wdl_database",
                      host = "localhost",
                      user = "user",
                      password = "password",
                      port = 3306)

dfData <- dbGetQuery(database, "SELECT * FROM discord_messages")
Warning: unrecognized MySQL field type 7 in column 6 imported as character
    SELECT
    UserId,
    Name,
    COUNT(MessageId) AS TotalMessages,
    DATE_FORMAT(Timestamp, '%Y-%m') AS Month
FROM
    wdl_database.discord_messages
WHERE
    Name IN ('theycallmeq', 'jbuwu', 'snozledozle', 'thefyreprophecy', 'joppertje','lykozen','coeus._','coeus7680')
GROUP BY
    UserId, Name, DATE_FORMAT(Timestamp, '%Y-%m')
ORDER BY
    DATE_FORMAT(Timestamp, '%Y-%m');
result_messagespermonth<- dbGetQuery(database, "
    SELECT
    UserId,
    Name,
    COUNT(MessageId) AS TotalMessages,
    DATE_FORMAT(Timestamp, '%Y-%m') AS Month
FROM
    wdl_database.discord_messages
WHERE
    Name IN ('theycallmeq', 'jbuwu', 'snozledozle', 'thefyreprophecy', 'joppertje','lykozen','coeus._','coeus7680')
GROUP BY
    UserId, Name, DATE_FORMAT(Timestamp, '%Y-%m')
ORDER BY
    DATE_FORMAT(Timestamp, '%Y-%m');
")
Warning: The working directory was changed to /home/tariq inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
plot_messagepermonth <- ggplot(result_messagespermonth, aes(x = Month, y = TotalMessages, fill = Name)) +
  geom_bar(stat = "identity") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +  # Rotate x-axis labels if needed
  labs(title = "Monthly Messages per User", 
       x = "Month", 
       y = "Total Messages")

ggplotly(plot_messagepermonth)
SELECT COUNT(*) as TotalMessages
FROM wdl_database.discord_messages;
result_totalmessages<- dbGetQuery(database, "
SELECT COUNT(*) as TotalMessages
FROM wdl_database.discord_messages;
")
SELECT Name, COUNT(distinct Id) as MostMessages 
FROM wdl_database.discord_messages
GROUP BY Name
ORDER BY MostMessages DESC
LIMIT 1;
result_mostmessages<- dbGetQuery(database, "
SELECT Name, COUNT(distinct Id) as MostMessages 
FROM wdl_database.discord_messages
GROUP BY Name
ORDER BY MostMessages DESC
LIMIT 1;
")
SELECT *
FROM wdl_database.discord_messages
WHERE Content LIKE '%http%';
SELECT PremiumType, 
       GROUP_CONCAT(DISTINCT Name ORDER BY Name SEPARATOR ', ') AS Users, 
       COUNT(DISTINCT Name) AS UniqueUserCount
FROM wdl_database.discord_messages
GROUP BY PremiumType;
result_nitrodistrobutionperusers<- dbGetQuery(database, "
SELECT PremiumType, 
       GROUP_CONCAT(DISTINCT Name ORDER BY Name SEPARATOR ', ') AS Users, 
       COUNT(DISTINCT Name) AS UniqueUserCount
FROM wdl_database.discord_messages
GROUP BY PremiumType;
")
plot_ly(result_nitrodistrobutionperusers, labels = ~PremiumType, values = ~UniqueUserCount, type = 'pie',
  textinfo = 'label+percent', insidetextorientation = 'radial') %>%
  layout(title = 'Distribution of Premium Types Among Users')
NA
    SELECT
    Name,
    COUNT(MessageId) AS TotalMessages
FROM
    wdl_database.discord_messages
WHERE
    Name IN ('theycallmeq', 'jbuwu', 'snozledozle', 'thefyreprophecy', 'joppertje','lykozen','coeus._','coeus7680')
GROUP BY
    Name
HAVING
    COUNT(MessageId) >= 100;
result_totalmessagesperuser<- dbGetQuery(database, "
    SELECT
    Name,
    COUNT(MessageId) AS TotalMessages
FROM
    wdl_database.discord_messages
WHERE
    Name IN ('theycallmeq', 'jbuwu', 'snozledozle', 'thefyreprophecy', 'joppertje','lykozen','coeus._','coeus7680')
GROUP BY
    Name
HAVING
    COUNT(MessageId) >= 100;
")
plot_totalmessagesperuser <- ggplot(result_totalmessagesperuser, aes(x = Name, y = TotalMessages, fill = Name)) +
  geom_bar(stat = "identity") +
  theme_minimal() +
  labs(title = "Total Messages per User",
       x = "User Name",
       y = "Total Messages") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Rotate x-axis labels for readability

# Convert to an interactive plotly object
ggplotly(plot_totalmessagesperuser)
word_frequencies <- dfData %>% 
  unnest_tokens(word, Content) %>%  # Split text into words
  count(word, sort = TRUE)          # Count and sort by frequency
top_words <- head(word_frequencies, 50)
print(top_words)
# Assuming top_words is already created and contains the top 50 words
plot_topwords <- ggplot(top_words, aes(x = reorder(word, n), y = n, fill = word)) +
  geom_bar(stat = "identity") +
  coord_flip() +  # Flips the coordinates to make the plot horizontal
  scale_fill_viridis_d() +  # Use the viridis color palette for discrete data
  labs(title = "Top 50 Word Frequencies",
       x = "Words",
       y = "Frequency") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1),  # Adjust x-axis labels for readability
        legend.position = "none")  # Hide the legend

# Convert to an interactive plotly object
ggplotly(plot_topwords)
NA
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ3RybCtTaGlmdCtFbnRlciouIAoKYGBge3J9CmxpYnJhcnkoZmxleGRhc2hib2FyZCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoUk15U1FMKQpsaWJyYXJ5KERCSSkKbGlicmFyeSh0aWR5dGV4dCkKbGlicmFyeSh3b3JkY2xvdWQpCmBgYAoKCmBgYHtyfQojIENvbm5lY3QgdG8gYSBTUUxpdGUgaW4tbWVtb3J5IGRhdGFiYXNlCmRhdGFiYXNlIDwtIGRiQ29ubmVjdChNeVNRTCgpLCAKICAgICAgICAgICAgICAgICAgICAgIGRibmFtZSA9ICJ3ZGxfZGF0YWJhc2UiLAogICAgICAgICAgICAgICAgICAgICAgaG9zdCA9ICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgICAgICAgdXNlciA9ICJ1c2VyIiwKICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkID0gInBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICAgICAgIHBvcnQgPSAzMzA2KQoKZGZEYXRhIDwtIGRiR2V0UXVlcnkoZGF0YWJhc2UsICJTRUxFQ1QgKiBGUk9NIGRpc2NvcmRfbWVzc2FnZXMiKQpgYGAKCgpgYGB7c3FsIGNvbm5lY3Rpb249ZGF0YWJhc2V9CiAgICBTRUxFQ1QKICAgIFVzZXJJZCwKICAgIE5hbWUsCiAgICBDT1VOVChNZXNzYWdlSWQpIEFTIFRvdGFsTWVzc2FnZXMsCiAgICBEQVRFX0ZPUk1BVChUaW1lc3RhbXAsICclWS0lbScpIEFTIE1vbnRoCkZST00KICAgIHdkbF9kYXRhYmFzZS5kaXNjb3JkX21lc3NhZ2VzCldIRVJFCiAgICBOYW1lIElOICgndGhleWNhbGxtZXEnLCAnamJ1d3UnLCAnc25vemxlZG96bGUnLCAndGhlZnlyZXByb3BoZWN5JywgJ2pvcHBlcnRqZScsJ2x5a296ZW4nLCdjb2V1cy5fJywnY29ldXM3NjgwJykKR1JPVVAgQlkKICAgIFVzZXJJZCwgTmFtZSwgREFURV9GT1JNQVQoVGltZXN0YW1wLCAnJVktJW0nKQpPUkRFUiBCWQogICAgREFURV9GT1JNQVQoVGltZXN0YW1wLCAnJVktJW0nKTsKYGBgCgoKYGBge3J9CnJlc3VsdF9tZXNzYWdlc3Blcm1vbnRoPC0gZGJHZXRRdWVyeShkYXRhYmFzZSwgIgogICAgU0VMRUNUCiAgICBVc2VySWQsCiAgICBOYW1lLAogICAgQ09VTlQoTWVzc2FnZUlkKSBBUyBUb3RhbE1lc3NhZ2VzLAogICAgREFURV9GT1JNQVQoVGltZXN0YW1wLCAnJVktJW0nKSBBUyBNb250aApGUk9NCiAgICB3ZGxfZGF0YWJhc2UuZGlzY29yZF9tZXNzYWdlcwpXSEVSRQogICAgTmFtZSBJTiAoJ3RoZXljYWxsbWVxJywgJ2pidXd1JywgJ3Nub3psZWRvemxlJywgJ3RoZWZ5cmVwcm9waGVjeScsICdqb3BwZXJ0amUnLCdseWtvemVuJywnY29ldXMuXycsJ2NvZXVzNzY4MCcpCkdST1VQIEJZCiAgICBVc2VySWQsIE5hbWUsIERBVEVfRk9STUFUKFRpbWVzdGFtcCwgJyVZLSVtJykKT1JERVIgQlkKICAgIERBVEVfRk9STUFUKFRpbWVzdGFtcCwgJyVZLSVtJyk7CiIpCmBgYApgYGB7cn0KcGxvdF9tZXNzYWdlcGVybW9udGggPC0gZ2dwbG90KHJlc3VsdF9tZXNzYWdlc3Blcm1vbnRoLCBhZXMoeCA9IE1vbnRoLCB5ID0gVG90YWxNZXNzYWdlcywgZmlsbCA9IE5hbWUpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSArICAjIFJvdGF0ZSB4LWF4aXMgbGFiZWxzIGlmIG5lZWRlZAogIGxhYnModGl0bGUgPSAiTW9udGhseSBNZXNzYWdlcyBwZXIgVXNlciIsIAogICAgICAgeCA9ICJNb250aCIsIAogICAgICAgeSA9ICJUb3RhbCBNZXNzYWdlcyIpCgpnZ3Bsb3RseShwbG90X21lc3NhZ2VwZXJtb250aCkKYGBgCgpgYGB7c3FsIGNvbm5lY3Rpb249ZGF0YWJhc2V9ClNFTEVDVCBDT1VOVCgqKSBhcyBUb3RhbE1lc3NhZ2VzCkZST00gd2RsX2RhdGFiYXNlLmRpc2NvcmRfbWVzc2FnZXM7CmBgYApgYGB7cn0KcmVzdWx0X3RvdGFsbWVzc2FnZXM8LSBkYkdldFF1ZXJ5KGRhdGFiYXNlLCAiClNFTEVDVCBDT1VOVCgqKSBhcyBUb3RhbE1lc3NhZ2VzCkZST00gd2RsX2RhdGFiYXNlLmRpc2NvcmRfbWVzc2FnZXM7CiIpCmBgYAoKYGBge3NxbCBjb25uZWN0aW9uPWRhdGFiYXNlfQpTRUxFQ1QgTmFtZSwgQ09VTlQoZGlzdGluY3QgSWQpIGFzIE1vc3RNZXNzYWdlcyAKRlJPTSB3ZGxfZGF0YWJhc2UuZGlzY29yZF9tZXNzYWdlcwpHUk9VUCBCWSBOYW1lCk9SREVSIEJZIE1vc3RNZXNzYWdlcyBERVNDCkxJTUlUIDE7CmBgYApgYGB7cn0KcmVzdWx0X21vc3RtZXNzYWdlczwtIGRiR2V0UXVlcnkoZGF0YWJhc2UsICIKU0VMRUNUIE5hbWUsIENPVU5UKGRpc3RpbmN0IElkKSBhcyBNb3N0TWVzc2FnZXMgCkZST00gd2RsX2RhdGFiYXNlLmRpc2NvcmRfbWVzc2FnZXMKR1JPVVAgQlkgTmFtZQpPUkRFUiBCWSBNb3N0TWVzc2FnZXMgREVTQwpMSU1JVCAxOwoiKQpgYGAKCmBgYHtzcWwgY29ubmVjdGlvbj1kYXRhYmFzZX0KU0VMRUNUICoKRlJPTSB3ZGxfZGF0YWJhc2UuZGlzY29yZF9tZXNzYWdlcwpXSEVSRSBDb250ZW50IExJS0UgJyVodHRwJSc7CmBgYAoKCmBgYHtzcWwgY29ubmVjdGlvbj1kYXRhYmFzZX0KU0VMRUNUIFByZW1pdW1UeXBlLCAKICAgICAgIEdST1VQX0NPTkNBVChESVNUSU5DVCBOYW1lIE9SREVSIEJZIE5hbWUgU0VQQVJBVE9SICcsICcpIEFTIFVzZXJzLCAKICAgICAgIENPVU5UKERJU1RJTkNUIE5hbWUpIEFTIFVuaXF1ZVVzZXJDb3VudApGUk9NIHdkbF9kYXRhYmFzZS5kaXNjb3JkX21lc3NhZ2VzCkdST1VQIEJZIFByZW1pdW1UeXBlOwpgYGAKCmBgYHtyfQpyZXN1bHRfbml0cm9kaXN0cm9idXRpb25wZXJ1c2VyczwtIGRiR2V0UXVlcnkoZGF0YWJhc2UsICIKU0VMRUNUIFByZW1pdW1UeXBlLCAKICAgICAgIEdST1VQX0NPTkNBVChESVNUSU5DVCBOYW1lIE9SREVSIEJZIE5hbWUgU0VQQVJBVE9SICcsICcpIEFTIFVzZXJzLCAKICAgICAgIENPVU5UKERJU1RJTkNUIE5hbWUpIEFTIFVuaXF1ZVVzZXJDb3VudApGUk9NIHdkbF9kYXRhYmFzZS5kaXNjb3JkX21lc3NhZ2VzCkdST1VQIEJZIFByZW1pdW1UeXBlOwoiKQpgYGAKCmBgYHtyfQpwbG90X2x5KHJlc3VsdF9uaXRyb2Rpc3Ryb2J1dGlvbnBlcnVzZXJzLCBsYWJlbHMgPSB+UHJlbWl1bVR5cGUsIHZhbHVlcyA9IH5VbmlxdWVVc2VyQ291bnQsIHR5cGUgPSAncGllJywKICB0ZXh0aW5mbyA9ICdsYWJlbCtwZXJjZW50JywgaW5zaWRldGV4dG9yaWVudGF0aW9uID0gJ3JhZGlhbCcpICU+JQogIGxheW91dCh0aXRsZSA9ICdEaXN0cmlidXRpb24gb2YgUHJlbWl1bSBUeXBlcyBBbW9uZyBVc2VycycpCgpgYGAKCgpgYGB7c3FsIGNvbm5lY3Rpb249ZGF0YWJhc2V9CiAgICBTRUxFQ1QKICAgIE5hbWUsCiAgICBDT1VOVChNZXNzYWdlSWQpIEFTIFRvdGFsTWVzc2FnZXMKRlJPTQogICAgd2RsX2RhdGFiYXNlLmRpc2NvcmRfbWVzc2FnZXMKV0hFUkUKICAgIE5hbWUgSU4gKCd0aGV5Y2FsbG1lcScsICdqYnV3dScsICdzbm96bGVkb3psZScsICd0aGVmeXJlcHJvcGhlY3knLCAnam9wcGVydGplJywnbHlrb3plbicsJ2NvZXVzLl8nLCdjb2V1czc2ODAnKQpHUk9VUCBCWQogICAgTmFtZQpIQVZJTkcKICAgIENPVU5UKE1lc3NhZ2VJZCkgPj0gMTAwOwpgYGAKYGBge3J9CnJlc3VsdF90b3RhbG1lc3NhZ2VzcGVydXNlcjwtIGRiR2V0UXVlcnkoZGF0YWJhc2UsICIKICAgIFNFTEVDVAogICAgTmFtZSwKICAgIENPVU5UKE1lc3NhZ2VJZCkgQVMgVG90YWxNZXNzYWdlcwpGUk9NCiAgICB3ZGxfZGF0YWJhc2UuZGlzY29yZF9tZXNzYWdlcwpXSEVSRQogICAgTmFtZSBJTiAoJ3RoZXljYWxsbWVxJywgJ2pidXd1JywgJ3Nub3psZWRvemxlJywgJ3RoZWZ5cmVwcm9waGVjeScsICdqb3BwZXJ0amUnLCdseWtvemVuJywnY29ldXMuXycsJ2NvZXVzNzY4MCcpCkdST1VQIEJZCiAgICBOYW1lCkhBVklORwogICAgQ09VTlQoTWVzc2FnZUlkKSA+PSAxMDA7CiIpCmBgYAoKYGBge3J9CnBsb3RfdG90YWxtZXNzYWdlc3BlcnVzZXIgPC0gZ2dwbG90KHJlc3VsdF90b3RhbG1lc3NhZ2VzcGVydXNlciwgYWVzKHggPSBOYW1lLCB5ID0gVG90YWxNZXNzYWdlcywgZmlsbCA9IE5hbWUpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnModGl0bGUgPSAiVG90YWwgTWVzc2FnZXMgcGVyIFVzZXIiLAogICAgICAgeCA9ICJVc2VyIE5hbWUiLAogICAgICAgeSA9ICJUb3RhbCBNZXNzYWdlcyIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSAgIyBSb3RhdGUgeC1heGlzIGxhYmVscyBmb3IgcmVhZGFiaWxpdHkKCiMgQ29udmVydCB0byBhbiBpbnRlcmFjdGl2ZSBwbG90bHkgb2JqZWN0CmdncGxvdGx5KHBsb3RfdG90YWxtZXNzYWdlc3BlcnVzZXIpCmBgYAoKYGBge3J9CndvcmRfZnJlcXVlbmNpZXMgPC0gZGZEYXRhICU+JSAKICB1bm5lc3RfdG9rZW5zKHdvcmQsIENvbnRlbnQpICU+JSAgIyBTcGxpdCB0ZXh0IGludG8gd29yZHMKICBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkgICAgICAgICAgIyBDb3VudCBhbmQgc29ydCBieSBmcmVxdWVuY3kKdG9wX3dvcmRzIDwtIGhlYWQod29yZF9mcmVxdWVuY2llcywgNTApCnByaW50KHRvcF93b3JkcykKYGBgCmBgYHtyfQojIEFzc3VtaW5nIHRvcF93b3JkcyBpcyBhbHJlYWR5IGNyZWF0ZWQgYW5kIGNvbnRhaW5zIHRoZSB0b3AgNTAgd29yZHMKcGxvdF90b3B3b3JkcyA8LSBnZ3Bsb3QodG9wX3dvcmRzLCBhZXMoeCA9IHJlb3JkZXIod29yZCwgbiksIHkgPSBuLCBmaWxsID0gd29yZCkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIGNvb3JkX2ZsaXAoKSArICAjIEZsaXBzIHRoZSBjb29yZGluYXRlcyB0byBtYWtlIHRoZSBwbG90IGhvcml6b250YWwKICBzY2FsZV9maWxsX3ZpcmlkaXNfZCgpICsgICMgVXNlIHRoZSB2aXJpZGlzIGNvbG9yIHBhbGV0dGUgZm9yIGRpc2NyZXRlIGRhdGEKICBsYWJzKHRpdGxlID0gIlRvcCA1MCBXb3JkIEZyZXF1ZW5jaWVzIiwKICAgICAgIHggPSAiV29yZHMiLAogICAgICAgeSA9ICJGcmVxdWVuY3kiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpLCAgIyBBZGp1c3QgeC1heGlzIGxhYmVscyBmb3IgcmVhZGFiaWxpdHkKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICAjIEhpZGUgdGhlIGxlZ2VuZAoKIyBDb252ZXJ0IHRvIGFuIGludGVyYWN0aXZlIHBsb3RseSBvYmplY3QKZ2dwbG90bHkocGxvdF90b3B3b3JkcykKCmBgYAoKCgo=